package cn.tedu.knows.portal.security;

import cn.tedu.knows.portal.service.impl.UserDetailsServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
//启动spring-security的权限管理功能
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    // 配置类要继承WebSecurityConfigurerAdapter
    // 这个父类提供了很多Spring-Security框架的配置方法
    // 我们可以重写这个父类中的方法来完成需要的配置
    // 下面这个配置就是配置了什么的样的用户能够登录
    // 代替了配置文件中的自定义用户
    @Autowired
    private UserDetailsServiceImpl userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //在我们用户登入时,会自动调用userDetailsService中的方法获得
        // 用户详情,这样会由spring-security框架获得,已进行后续判断
        auth.userDetailsService(userDetailsService);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()//禁用防跨域攻击功能
                .authorizeRequests() //表示开始设置页面的访问权限
                //指定一些路径
                .antMatchers(
                        //"/index_student.html",
                        "/css/*",
                        "/js/*",
                        "/img/**",
                        "/bower_components/**",
                        "/login.html",
                        "/register.html",
                        "/register"
                ).permitAll() //上面设置的路径全部放行(不登入也能访问)
                .anyRequest()//其他请求
                .authenticated()//需要登入才能访问
                .and()   //是一个分割,表示上面配置完毕,开始配置下面内容
                .formLogin()//使用表单登入
                .loginPage("/login.html")//配置登入页面使用login.html
                .loginProcessingUrl("/login")//处理登入请求的路径 和登入表单路径一致
                .failureUrl("/login.html?error")//登入失败显示错误信息,留在登入页面
                .defaultSuccessUrl("/index.html")//登入成功 跳转到学生首页
                .and()
                .logout()//开始设置登出
                .logoutUrl("/logout")//只要访问的路径/logout就触发登出
                .logoutSuccessUrl("/login.html?logout");//登出返回登入页

    }
}
